package service

import (
	"encoding/json"
	"fmt"

	amtf "server/amtf/service"
	"server/global"
	"server/plugin/mall/model"
	"server/plugin/mall/model/request"

	"gorm.io/gorm"
)

var A商品 = new(shangpin)

type shangpin struct{}

// CreateA商品 创建商品记录
// Author [yourname](https://github.com/yourname)
func (s *shangpin) CreateA商品(shangpin *model.A商品) (err error) {
	err = global.GVA_DB.Create(shangpin).Error
	return err
}

// DeleteA商品 删除商品记录
// Author [yourname](https://github.com/yourname)
func (s *shangpin) DeleteA商品(ID string) (err error) {
	err = global.GVA_DB.Delete(&model.A商品{}, "id = ?", ID).Error
	return err
}

// DeleteA商品ByIds 批量删除商品记录
// Author [yourname](https://github.com/yourname)
func (s *shangpin) DeleteA商品ByIds(IDs []string) (err error) {
	err = global.GVA_DB.Delete(&[]model.A商品{}, "id in ?", IDs).Error
	return err
}

// UpdateA商品 更新商品记录
// func (s *shangpin) UpdateA商品(shangpin model.A商品) (err error) {
// 	fmt.Printf("shangpin: %+v\n", shangpin)
// 	err = global.GVA_DB.Model(&model.A商品{}).Where("id = ?", shangpin.ID).Updates(&shangpin).Error
// 	return err
// }

func (s *shangpin) UpdateA商品(shangpin model.A商品) (err error) {
	// 打印商品信息
	// fmt.Printf("shangpin: %+v\n", shangpin)

	// 开始事务
	tx := global.GVA_DB.Begin()
	defer 处理事务异常(tx, &err)

	// 更新商品基本信息
	if err = tx.Model(&shangpin).Where("id =?", &shangpin.ID).Updates(&shangpin).Error; err != nil {
		return err
	}

	// 处理 SKU
	for _, SKU := range shangpin.SKUS {
		if SKU.ID == 0 {
			// 新增 SKU
			SKU.A商品id = shangpin.ID // 确保设置商品ID
			if err = tx.Create(&SKU).Error; err != nil {
				return err
			}
		} else {
			// 更新现有 SKU
			if err = tx.Model(SKU).Where("id =?", SKU.ID).Updates(&SKU).Error; err != nil {
				return err
			}
		}
	}

	// fmt.Printf("shangpin.A拟删除子表ids: %+v\n", shangpin.A拟删除子表ids)
	if len(shangpin.A拟删除子表ids) == 0 {
		return nil
	}

	var ids []string
	if err := json.Unmarshal(shangpin.A拟删除子表ids, &ids); err != nil {
		// fmt.Println("解码 JSON 时出错:", err)
		return err
	}

	err = tx.Unscoped().Delete(&[]model.A商品sku{}, "id in ?", ids).Error

	// 提交事务
	return tx.Commit().Error
}

func 处理事务异常(tx *gorm.DB, err *error) {
	if r := recover(); r != nil {
		tx.Rollback()
		*err = fmt.Errorf("panic: %v", r)
	}
}

// func 改(tx *gorm.DB, model interface{}, id interface{}, data interface{}) error {
// 	result := tx.Model(model).Where("id =?", id).Updates(data)
// 	return result.Error
// }

// func 增(tx *gorm.DB, model interface{}) error {
// 	result := tx.Create(model)
// 	return result.Error
// }

// func 删(tx *gorm.DB, model interface{}, id interface{}, 是否硬删 ...bool) error {
// 	硬删 := true // 默认为硬删除
// 	if len(是否硬删) > 0 {
// 		硬删 = 是否硬删[0]
// 	}
// 	var result *gorm.DB
// 	if 硬删 {
// 		result = tx.Unscoped().Delete(model, id)
// 	} else {
// 		result = tx.Delete(model, id)
// 	}
// 	return result.Error
// }

// GetA商品 根据ID获取商品记录
func (s *shangpin) GetA商品(ID string) (shangpin model.A商品, err error) {
	// err = global.GVA_DB.Debug().Where("id = ?", ID).Preload("SKUS", func(db *gorm.DB) *gorm.DB {
	// 	return db.Order("updated_at DESC") // 按照 updated_at 字段降序排序
	// }).First(&shangpin).Error
	// fmt.Printf("shangpin: %+v\n", shangpin)
	err = amtf.A关联查询(&shangpin, ID)
	return
}

// GetA商品InfoList 分页获取商品记录
// Author [yourname](https://github.com/yourname)
func (s *shangpin) GetA商品InfoList(info request.A商品Search) (list []model.A商品, total int64, err error) {
	limit := info.PageSize
	offset := info.PageSize * (info.Page - 1)
	// 创建db
	db := global.GVA_DB.Model(&model.A商品{})
	var shangpins []model.A商品
	// 如果有条件搜索 下方会自动创建搜索语句
	if info.StartCreatedAt != nil && info.EndCreatedAt != nil {
		db = db.Where("created_at BETWEEN ? AND ?", info.StartCreatedAt, info.EndCreatedAt)
	}
	err = db.Count(&total).Error
	if err != nil {
		return
	}

	if limit != 0 {
		db = db.Limit(limit).Offset(offset)
	}
	err = db.Find(&shangpins).Error
	// err = db.Preload("SKUS").Find(&shangpins).Error

	return shangpins, total, err
}
func (s *shangpin) GetA商品DataSource() (res map[string][]map[string]any, err error) {
	res = make(map[string][]map[string]any)

	类别 := make([]map[string]any, 0)

	global.GVA_DB.Table("类别设置").Where("deleted_at IS NULL").Select("类别 as label,id as value").Scan(&类别)
	res["类别"] = 类别
	return
}

func (s *shangpin) GetA商品Public() {

}
